<template>
  <div class="dropdown" ref="dropdownRef">
    <a
      href="#"
      class="btn btn-outline-light my-2 dropdown-toggle"
      @click="toggleOpen"
    >
      {{ title }}
    </a>

    <!-- dropdown-menu 预设值是 display:'none' 需设置 block才能显示 -->
    <ul class="dropdown-menu" :style="{ display: 'block' }" v-if="isOpen">
      <slot></slot>
    </ul>
  </div>
</template>
 
<script lang='ts'>
import { defineComponent, ref, watch } from "vue";
import useClickOutside from "../hooks/useClickOutside";
export default defineComponent({
  name: "Dropdown",

  props: {
    title: {
      // 类型：字符串
      type: String,
      // 必选项
      required: true,
    },
  },

  setup() {
    // 控制下拉列表 -> 新建文章 -> 编辑资料
    const isOpen = ref(false);
    
    // setup无法使用this，那怎么办呢？ 其实Vue3提供了一个更简单的方法让你获得DOM对象
    const dropdownRef = ref<null | HTMLElement>(null);

    // 点击的时候 改变 ref的值,从而控制下拉菜单的隐藏/显示
    const toggleOpen = () => {
      isOpen.value = !isOpen.value;
    };

    
    //* setup中，这段逻辑只能被执行一次，更新时这段代码不会被执行的
    //* 使用 watch，来侦测他的变化
    const isClickOutside = useClickOutside(dropdownRef);

    watch(isClickOutside, () => {
      if (isOpen.value && isClickOutside.value) {
        isOpen.value = false;
      }
    });
    return {
      isOpen,
      toggleOpen,
      dropdownRef, //必须 和ref中的名称相对应
    };
  },
});
</script>